{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%pip install -q bqplot ipyleaflet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "from urllib.request import urlopen\n",
    "import json\n",
    "from datetime import datetime\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "from js import fetch\n",
    "\n",
    "from ipywidgets import Dropdown\n",
    "\n",
    "from bqplot import Lines, Figure, LinearScale, DateScale, Axis\n",
    "\n",
    "from ipyleaflet import Map, GeoJSON, WidgetControl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "URL = \"https://raw.githubusercontent.com/jupyter-widgets/ipyleaflet/master/examples/nations.json\"\n",
    "\n",
    "res = await fetch(URL)\n",
    "text = await res.text()\n",
    "\n",
    "data = pd.read_json(text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def clean_data(data):\n",
    "    for column in ['income', 'lifeExpectancy', 'population']:\n",
    "        data = data.drop(data[data[column].apply(len) <= 4].index)\n",
    "    return data\n",
    "\n",
    "def extrap_interp(data):\n",
    "    data = np.array(data)\n",
    "    x_range = np.arange(1800, 2009, 1.)\n",
    "    y_range = np.interp(x_range, data[:, 0], data[:, 1])\n",
    "    return y_range\n",
    "\n",
    "def extrap_data(data):\n",
    "    for column in ['income', 'lifeExpectancy', 'population']:\n",
    "        data[column] = data[column].apply(extrap_interp)\n",
    "    return data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = clean_data(data)\n",
    "data = extrap_data(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "date_start = datetime(1800, 12, 31)\n",
    "date_end = datetime(2009, 12, 31)\n",
    "\n",
    "date_scale = DateScale(min=date_start, max=date_end)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "date_data = pd.date_range(start=date_start, end=date_end, freq='A', normalize=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "country_name = 'Angola'\n",
    "data_name = 'income'\n",
    "\n",
    "x_data = data[data.name == country_name][data_name].values[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_scale = LinearScale()\n",
    "\n",
    "lines = Lines(x=date_data, y=x_data, scales={'x': date_scale, 'y': x_scale})\n",
    "\n",
    "ax_x = Axis(label='Year', scale=date_scale, num_ticks=10, tick_format='%Y')\n",
    "ax_y = Axis(label=data_name.capitalize(), scale=x_scale, orientation='vertical', side='left')\n",
    "\n",
    "figure = Figure(axes=[ax_x, ax_y], title=country_name, marks=[lines], animation_duration=500,\n",
    "                layout={'max_height': '250px', 'max_width': '400px'})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def update_figure(country_name, data_name):\n",
    "    try:\n",
    "        lines.y = data[data.name == country_name][data_name].values[0]\n",
    "        ax_y.label = data_name.capitalize()\n",
    "        figure.title = country_name\n",
    "    except IndexError:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "URL = \"https://raw.githubusercontent.com/jupyter-widgets/ipyleaflet/master/examples/countries.geo.json\"\n",
    "\n",
    "res = await fetch(URL)\n",
    "text = await res.text()\n",
    "\n",
    "countries = json.loads(text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "m = Map(zoom=3)\n",
    "\n",
    "geo = GeoJSON(data=countries, style={'fillColor': 'white', 'weight': 0.5}, hover_style={'fillColor': '#1f77b4'}, name='Countries')\n",
    "m.add_layer(geo)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "widget_control1 = WidgetControl(widget=figure, position='bottomright')\n",
    "\n",
    "m.add_control(widget_control1)\n",
    "\n",
    "def on_hover(event, feature, **kwargs):\n",
    "    global country_name\n",
    "\n",
    "    country_name = feature['properties']['name']\n",
    "    update_figure(country_name, data_name)\n",
    "\n",
    "geo.on_hover(on_hover)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "dropdown = Dropdown(\n",
    "    options=['income', 'population', 'lifeExpectancy'],\n",
    "    value=data_name,\n",
    "    description='Plotting:'\n",
    ")\n",
    "\n",
    "def on_click(change):\n",
    "    global data_name\n",
    "\n",
    "    data_name = change['new']\n",
    "    update_figure(country_name, data_name)\n",
    "\n",
    "dropdown.observe(on_click, 'value')\n",
    "\n",
    "widget_control2 = WidgetControl(widget=dropdown, position='bottomleft')\n",
    "\n",
    "m.add_control(widget_control2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "m"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python (Pyodide)",
   "language": "python",
   "name": "python"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "python",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8"
  },
  "orig_nbformat": 4,
  "toc-showcode": false
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
